package api

import (
	"vblog/app/token"
	"vblog/ioc"
	"vblog/response"

	"github.com/gin-gonic/gin"
)

type TokenApiHandler struct {
	// 依赖控制器
	tksvc token.Service
}

// 注册
func init() {
	ioc.ApiHandler().RegistryIoc(&TokenApiHandler{})
}

// 初始化apihandler
func (t *TokenApiHandler) Init() {
	t.tksvc = ioc.Controller().Get("token").(token.Service)
}

func (t *TokenApiHandler) Name() string {
	return "token"
}

// func NewTokenApiHandler(t *impl.TokenServiceImpl) *TokenApiHandler {
// 	return &TokenApiHandler{
// 		tksvc: t,
// 	}
// }

// 用自定义的ApiHandler，实现用户登录功能
func (t *TokenApiHandler) Login(c *gin.Context) {
	// 1.接收请求（获取用户请求参数），并把请求参数和结构体映射
	tk := token.NewLoginRequest()
	err := c.BindJSON(tk)
	if err != nil {
		response.Fail(c, err)
		return // 必须终止，否则会继续执行下面的代码！
	}

	// 2.处理请求
	tok, err := t.tksvc.Login(c.Request.Context(), tk)
	if err != nil {
		response.Fail(c, err)
		return
	}
	
	// 补充setcookie逻辑，把token保存在浏览器中
	c.SetCookie(token.TOKEN_COOKIE_NAME, tok.AccessToken, 0, "/", "localhost", false, true)

	// 3.返回响应
	response.Success(c, tok)
}

// 用自定义的ApiHandler，实现用登出功能
func (t *TokenApiHandler) Logout(c *gin.Context) {

}

// 定义路由
func (t *TokenApiHandler) Registry(r gin.IRouter) {
	// 创建路由组
	v := r.Group("v1")

	// 路由注册
	v.POST("token", t.Login)
	v.DELETE("token", t.Logout)

}
